package es.decloud.model;

import static javax.persistence.GenerationType.IDENTITY;

import java.io.Serializable;
import java.util.Date;
import java.util.HashSet;
import java.util.Set;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.JoinTable;
import javax.persistence.ManyToMany;
import javax.persistence.ManyToOne;
import javax.persistence.Table;

import org.apache.commons.lang.builder.ToStringBuilder;

@Entity
@Table(name = "fichero")
public class Fichero extends BaseObject implements Serializable {

	private static final long serialVersionUID = 3499382138255950881L;

	private Long id;
	private Usuario usuario;
	private Centro centro;
	private String nombreFisico;
	private String descripcion;
	private String contentType;
	private long longitud;
	private String ubicacion;
	private boolean esFoto;
	private boolean esVideo;
	private Set<Mensaje> mensajes = new HashSet<>(0);
	private Set<Album> albumes = new HashSet<>(0);

	public Fichero() {
	}

	public Fichero(Usuario usuario, Centro centro, String nombreFisico, String contentType, long longitud,
			String ubicacion, boolean esFoto, boolean esVideo) {
		this.usuario = usuario;
		this.centro = centro;
		this.nombreFisico = nombreFisico;
		this.contentType = contentType;
		this.longitud = longitud;
		this.ubicacion = ubicacion;
		this.esFoto = esFoto;
		this.esVideo = esVideo;
	}

	public Fichero(Usuario usuario, Centro centro, String nombreFisico, String descripcion, String contentType,
			long longitud, String ubicacion, boolean esFoto, boolean esVideo, Date fechaCreacion,
			Set<Mensaje> mensajes, Set<Album> albumes) {
		this.usuario = usuario;
		this.centro = centro;
		this.nombreFisico = nombreFisico;
		this.descripcion = descripcion;
		this.contentType = contentType;
		this.longitud = longitud;
		this.ubicacion = ubicacion;
		this.esFoto = esFoto;
		this.esVideo = esVideo;
		this.mensajes = mensajes;
		this.albumes = albumes;
	}

	@Id
	@GeneratedValue(strategy = IDENTITY)
	@Column(name = "id", unique = true, nullable = false)
	public Long getId() {
		return this.id;
	}

	public void setId(Long id) {
		this.id = id;
	}

	@ManyToOne
	@JoinColumn(name = "propietario_id", nullable = false)
	public Usuario getUsuario() {
		return this.usuario;
	}

	public void setUsuario(Usuario usuario) {
		this.usuario = usuario;
	}

	@ManyToOne
	@JoinColumn(name = "centro_id", nullable = false)
	public Centro getCentro() {
		return this.centro;
	}

	public void setCentro(Centro centro) {
		this.centro = centro;
	}

	@Column(name = "nombre_fisico", nullable = false)
	public String getNombreFisico() {
		return this.nombreFisico;
	}

	public void setNombreFisico(String nombreFisico) {
		this.nombreFisico = nombreFisico;
	}

	@Column(name = "descripcion", length = 500)
	public String getDescripcion() {
		return this.descripcion;
	}

	public void setDescripcion(String descripcion) {
		this.descripcion = descripcion;
	}

	@Column(name = "content_type", nullable = false)
	public String getContentType() {
		return this.contentType;
	}

	public void setContentType(String contentType) {
		this.contentType = contentType;
	}

	@Column(name = "longitud", nullable = false)
	public long getLongitud() {
		return this.longitud;
	}

	public void setLongitud(long longitud) {
		this.longitud = longitud;
	}

	@Column(name = "ubicacion", nullable = false, length = 1024)
	public String getUbicacion() {
		return this.ubicacion;
	}

	public void setUbicacion(String ubicacion) {
		this.ubicacion = ubicacion;
	}

	@Column(name = "es_foto", nullable = false)
	public boolean isEsFoto() {
		return this.esFoto;
	}

	public void setEsFoto(boolean esFoto) {
		this.esFoto = esFoto;
	}

	@Column(name = "es_video", nullable = false)
	public boolean isEsVideo() {
		return this.esVideo;
	}

	public void setEsVideo(boolean esVideo) {
		this.esVideo = esVideo;
	}

	@ManyToMany
	@JoinTable(name = "mensaje_fichero", joinColumns = { @JoinColumn(name = "fichero_id", nullable = false) }, inverseJoinColumns = { @JoinColumn(name = "mensaje_id", nullable = false) })
	public Set<Mensaje> getMensajes() {
		return this.mensajes;
	}

	public void setMensajes(Set<Mensaje> mensajes) {
		this.mensajes = mensajes;
	}

	@ManyToMany
	@JoinTable(name = "album_fichero", joinColumns = { @JoinColumn(name = "fichero_id", nullable = false) }, inverseJoinColumns = { @JoinColumn(name = "album_id", nullable = false) })
	public Set<Album> getAlbumes() {
		return this.albumes;
	}

	public void setAlbumes(Set<Album> albumes) {
		this.albumes = albumes;
	}

	@Override
	public int hashCode() {
		final int prime = 31;
		int result = 1;
		result = prime * result + ((contentType == null) ? 0 : contentType.hashCode());
		result = prime * result + ((descripcion == null) ? 0 : descripcion.hashCode());
		result = prime * result + (esFoto ? 1231 : 1237);
		result = prime * result + (esVideo ? 1231 : 1237);
		result = prime * result + (int) (longitud ^ (longitud >>> 32));
		result = prime * result + ((nombreFisico == null) ? 0 : nombreFisico.hashCode());
		result = prime * result + ((ubicacion == null) ? 0 : ubicacion.hashCode());
		return result;
	}

	@Override
	public boolean equals(Object obj) {
		if (this == obj)
			return true;
		if (obj == null)
			return false;
		if (getClass() != obj.getClass())
			return false;
		Fichero other = (Fichero) obj;
		if (contentType == null) {
			if (other.contentType != null)
				return false;
		}
		else if (!contentType.equals(other.contentType))
			return false;
		if (descripcion == null) {
			if (other.descripcion != null)
				return false;
		}
		else if (!descripcion.equals(other.descripcion))
			return false;
		if (esFoto != other.esFoto)
			return false;
		if (esVideo != other.esVideo)
			return false;
		if (longitud != other.longitud)
			return false;
		if (nombreFisico == null) {
			if (other.nombreFisico != null)
				return false;
		}
		else if (!nombreFisico.equals(other.nombreFisico))
			return false;
		if (ubicacion == null) {
			if (other.ubicacion != null)
				return false;
		}
		else if (!ubicacion.equals(other.ubicacion))
			return false;
		return true;
	}

	@Override
	public String toString() {
		return new ToStringBuilder(this).append("id", id).append("usuario", usuario)
				.append("nombreFisico", nombreFisico).append("descripcion", descripcion)
				.append("contentType", contentType).append("longitud", longitud).append("ubicacion", ubicacion)
				.append("esFoto", esFoto).append("esVideo", esVideo).toString();
	}

}
